From 999848e0c68dc7dbd319150208386b0a536d6780 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Tue, 27 Jun 2017 11:12:57 +0200 Subject: [PATCH] wayland: scale down reported monitor geometry MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit According to the documentation, gdk_monitor_get_geometry() reports the monitor geometry in ”application pixels”, not in ”device pixels”, meaning that the actual device resolution needs to be scaled down by the scale factor of the output. x11 backend does that downscaling, whereas Wayland backend did not, causing a discrepancy depending on the backend used. https://bugzilla.gnome.org/show_bug.cgi?id=783995 --- gdk/wayland/gdkscreen-wayland.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c index af2e2e28ab..b939fef1a0 100644 --- a/gdk/wayland/gdkscreen-wayland.c +++ b/gdk/wayland/gdkscreen-wayland.c @@ -754,11 +754,22 @@ output_handle_scale (void *data, int32_t scale) { GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data; + GdkRectangle previous_geometry; + int previous_scale; + int width; + int height; GDK_NOTE (MISC, g_message ("handle scale output %d, scale %d", monitor->id, scale)); + gdk_monitor_get_geometry (GDK_MONITOR (monitor), &previous_geometry); + previous_scale = gdk_monitor_get_scale_factor (GDK_MONITOR (monitor)); + + width = previous_geometry.width * previous_scale; + height = previous_geometry.height * previous_scale; + gdk_monitor_set_scale_factor (GDK_MONITOR (monitor), scale); + gdk_monitor_set_size (GDK_MONITOR (monitor), width / scale, height / scale); if (GDK_MONITOR (monitor)->geometry.width != 0 && monitor->version < OUTPUT_VERSION_WITH_DONE) { @@ -776,6 +787,7 @@ output_handle_mode (void *data, int refresh) { GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data; + int scale; GDK_NOTE (MISC, g_message ("handle mode output %d, size %d %d, rate %d", @@ -784,7 +796,8 @@ output_handle_mode (void *data, if ((flags & WL_OUTPUT_MODE_CURRENT) == 0) return; - gdk_monitor_set_size (GDK_MONITOR (monitor), width, height); + scale = gdk_monitor_get_scale_factor (GDK_MONITOR (monitor)); + gdk_monitor_set_size (GDK_MONITOR (monitor), width / scale, height / scale); gdk_monitor_set_refresh_rate (GDK_MONITOR (monitor), refresh); if (width != 0 && monitor->version < OUTPUT_VERSION_WITH_DONE) -- 2.30.2